package IOStream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Scanner;

/**
 * @description 文件复制器
 * @author 李小玲
 * @date 2022/3/29
 */
public class FileCopy {
    public static void main(String[] args)   {
        /*
        尝试用Java基础的内容编写一个文件复制器,
        支持让用户输入目标文件的路径和要复制的目标路径，实现将目标文件复制到目标路径下的功能◦
        思考：
            如何限制用户不做出错误的行为◦
            用户行为有误程序如何引导用户做出正确的行为
         */

        //创建文件输出流和输入流
        FileInputStream fis=null;
        FileOutputStream fos=null;

        //调用方法在控制台输入复制源路径
        String srcPath=inputSrcPath();

        //判断路径是否合法
        judge(srcPath);

        //调用方法在控制台输入复制目标路径
        String destPath=inputDestPath();

        //判断路径是否正确
        judge(destPath);

        try {
            byte [] bytes=new byte[1024*1024];
            fis= new FileInputStream(srcPath);
            fos =new FileOutputStream(destPath);
            int readCount=0;
            //一边读一边写
            while((readCount=fis.read(bytes))!=-1){
                fos.write(bytes);
            }

                fos.flush();

        } catch (IOException e  ) {
            e.printStackTrace();
        }finally{
            //资源关闭
            if(fis!=null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(fos!=null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    /**
     * @description 获取复制源文件路径
     * @return String 返回控制台输入的路径
     */
    public static String inputSrcPath()
    {
        String srcPath;
        System.out.println("请输入拷贝源文件路径：");
        Scanner scanner=new Scanner(System.in);
        srcPath=scanner.nextLine();
        //限制出错，引导修改
        return srcPath;
    }

    /**
     * @description 获取复制目标文件路径
     * @return 返回控制台输入的路径
     */

    public static String inputDestPath()
    {
        String destPath;
        System.out.println("请输入拷贝到的目标文件路径：");
        Scanner scanner= new Scanner(System.in);
        destPath=scanner.nextLine();
        //限制出错，引导修改
        return destPath;
    }

    /**
     * @description 判断路径是否合法
     * @param s 需判断的路径
     */
    public static void judge(String s){
        //字符串转化成字符数组
        byte []bytes=s.getBytes();
        int node = 1;
        do {
            if (bytes.length > 255) {
                node=0;
                System.out.println("文件路径错误！错误信息：文件路径长度不符!");
                System.out.println("请重新输入拷贝源文件路径：");
                inputSrcPath();
            }
        }while(node==0);


        for(int i=0;i<bytes.length;i++) {
            byte b = bytes[i];

            do {
                if (b == '?' || b == '*' || b == '<' || b == '>'  || b == '|' || b == '"') {
                    node=0;
                    System.out.println("文件路径错误！错误信息：文件路径含不合法字符！");
                    System.out.println("请重新输入拷贝到的目标文件路径：");
                    inputDestPath();
                }
            }while(node==0);
        }
    }

}
